package com.zzg.datastructure.tree.binarytree;

import com.zzg.datastructure.tree.entity.HeroNode;
import lombok.Setter;

import java.util.Objects;

/**
 * @Author zhengzg
 * @Date 2022-09-16
 * @Version v1.0
 */
@Setter
public class BinaryTree {
    private HeroNode root;

    /**
     * 前序遍历
     */
    public void preOrder() {
        if (Objects.nonNull(this.root)) {
            this.root.perOrder();
        } else {
            System.out.println("二叉树为空，无法遍历");
        }
    }

    /**
     * 中序遍历
     */
    public void infixOrder() {
        if (Objects.nonNull(this.root)) {
            this.root.infixOrder();
        } else {
            System.out.println("二叉树为空，无法遍历");
        }
    }

    /**
     * 后续遍历
     */
    public void postOrder() {
        if (Objects.nonNull(this.root)) {
            this.root.postOrder();
        } else {
            System.out.println("二叉树为空，无法遍历");
        }
    }


    /**
     * 前序遍历查找
     */
    public void preOrderSearch(int no) {
        if (Objects.nonNull(this.root)) {
            System.out.println(this.root.perOrderSearch(no));
        } else {
            System.out.println("二叉树为空，无法遍历");
        }
    }

    /**
     * 中序遍历查找
     */
    public void infixOrderSearch(int no) {
        if (Objects.nonNull(this.root)) {
            System.out.println(this.root.infixOrderSearch(no));
        } else {
            System.out.println("二叉树为空，无法遍历");
        }
    }

    /**
     * 后续遍历查找
     */
    public void postOrderSearch(int no) {
        if (Objects.nonNull(this.root)) {
            System.out.println(this.root.postOrderSearch(no));
        } else {
            System.out.println("二叉树为空，无法遍历");
        }
    }

    /**
     * 删除节点
     * @param no 节点编号
     */
    public void delNode(int no) {
        if (Objects.nonNull(this.root)) {
            if (Objects.equals(this.root.getNo(),no)) {
                root = null;
            } else {
                // 递归删除
                this.root.delNode(no);
            }
        } else {
            System.out.println("空树，无法删除");
        }
    }

}
